/**
 * 
 */
package com.newer.config.shiro.filters;

import java.util.List;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.CollectionUtils;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;

/**
 * 自定义角色过滤方式
 * 
 * @author 寻添俊
 * 2017年11月29日-下午8:03:00
 */
public class AnyRoleAuthorizationFilter extends AuthorizationFilter {

	/* (non-Javadoc)
	 * @see org.apache.shiro.web.filter.AccessControlFilter#isAccessAllowed(javax.servlet.ServletRequest, javax.servlet.ServletResponse, java.lang.Object)
	 */
	@Override
	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response,
			Object mappedValue) {
		// 获取当前登录的主体
		Subject subject = getSubject(request, response);

		// 配置的访问所需角色
		String[] rolesArray = (String[]) mappedValue;
		if (rolesArray == null || rolesArray.length == 0) {
			return true;
		}
		// 需要修改的地方在这里，判断访问所需的角色是否包含当前用户的角色
		List<String> roles = CollectionUtils.asList(rolesArray);
		// hasRoles:是否拥有某个角色
		// 当前登录主体拥有user角色
		// [admin,teacher,user]
		// subject.hasRoles(roles)返回结果为:[false,false,ture]
		boolean[] bo = subject.hasRoles(roles);
		// 如果有一个角色满足，则可以访问
		for (boolean b : bo) {
			if (b == true) {
				// 表示有权限访问
				return true;
			}
		}
		// 表示没权限访问
		return false;
	}
}
